/**
 * 给定数组A和B，再给定一些禁止选择的对，禁选的数量最多到1E5
 * 要求从A和B中各选一个元素使得和最大
 * 如果没有禁选的，显然选择A、B最大的即可
 * 现在存在禁选，按从大到小依次查看即可，最多查到1E5+1，肯定有结果
 * 使用优先级队列即可
 * 比赛时忘记设置入队标记，导致T
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using pii = pair<int, int>;
using vi = vector<int>;

struct _t{
    int v;
    int idx;
};

int N, M, L;
vector<_t> A, B;
// map<int, set<int>> Map;

set<pii> Set;

bool isOK(int c, int d){
    return Set.find({c, d}) == Set.end();
}

int proc(){
    sort(A.begin(), A.end(), [](_t a, _t b){
        if(a.v != b.v) return a.v > b.v;
        return a.idx < b.idx;
    });

    sort(B.begin(), B.end(), [](_t a, _t b){
        if(a.v != b.v) return a.v > b.v;
        return a.idx < b.idx;
    });

    __gnu_pbds::priority_queue<pii, function<bool(const pii&, const pii&)>> q([&](const pii&a, const pii&b){
        auto av = A[a.first].v + B[a.second].v;
        auto bv = A[b.first].v + B[b.second].v;
        if(av != bv) return av < bv;
        if(a.first != b.first) return a.first > b.first;
        return a.second > b.second;     
    });

    if(isOK(A[0].idx, B[0].idx)) return A[0].v + B[0].v;
    q.push({0, 0});
    set<pii> flag;
    flag.insert({0, 0});

    int left = L;
    while(1){ 
        auto h = q.top(); q.pop();   
        if(isOK(A[h.first].idx, B[h.second].idx)){
            return A[h.first].v + B[h.second].v;
        }

        if(h.first + 1 < N){
            auto it = flag.find({h.first + 1, h.second});
            if(it == flag.end()){
                q.push({h.first + 1, h.second});
                flag.insert(it, {h.first + 1, h.second});
            }
            
        }
        if(h.second + 1 < M){
            auto it = flag.find({h.first, h.second + 1});
            if(it == flag.end()){
                flag.insert(it, {h.first, h.second + 1});
                q.push({h.first, h.second + 1});
            }
            
        }
    }   
    assert(0); 
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    cin >> N >> M >> L;
    A.assign(N, {});
    B.assign(M, {});
    int k = 1;
    for(auto & t : A) cin >> t.v, t.idx = k++;
    k = 1;
    for(auto & t : B) cin >> t.v, t.idx = k++;
    for(int c,d,i=0;i<L;++i){
        cin >> c >> d;
        Set.insert({c, d});
    }
    cout << proc() << endl;
    return 0;
}